关于c#:强制将excel窗口置于最前面? |
您所在的位置:网站首页 › excel 窗口 › 关于c#:强制将excel窗口置于最前面? |
我有一个用C# .NET开发的小型应用程序,可以处理excel表格,我不知道为什么有些用户不断告诉我,尽管他们将excel设置为打开时,在打开excel文件时该窗口没有出现在顶部/顶部对true可见,并且窗口状态处于最大化状态。 这是读取excel文件的函数: 12345678910111213141516171819202122public static void OpenExcel(string fileName, bool visibility, FunctionToExecute fn = null) { string addInPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),"Microsoft\\\\AddIns\\\\mDF_XLcalendar.xla"); deleg = fn; app = new Excel.Application(); app.Workbooks.Open(addInPath); app.Workbooks.Open(fileName); app.ScreenUpdating = true; app.DisplayAlerts = true; app.Visible = visibility; app.UserControl = true; app.WindowState = Excel.XlWindowState.xlMaximized; EventDel_BeforeBookClose = new Excel.AppEvents_WorkbookBeforeCloseEventHandler(application_WorkbookBeforeClose); EventSave_BeforeBookClose = new Excel.AppEvents_WorkbookBeforeSaveEventHandler(Open_ExcelApp_WorkbookBeforeSave); app.WorkbookBeforeClose += EventDel_BeforeBookClose; app.WorkbookBeforeSave += EventSave_BeforeBookClose; }有什么想法吗? 相关讨论 是因为您实际上在打开工作簿后正在设置WindowState吗? 如果您的.Net代码在Excel应用程序打开后仍需要执行一些代码,那么它将把焦点重新放在程序上。而且,如果您的程序具有GUI,则它将位于Excel之上。因此,您可以尝试的一件事是将打开Excel的行移至代码的末尾 我试过了,但是没用,问题是我无法在我的机器上重现该问题,因为它在我的机器上工作得很好... 我打开了一个Excel应用程序,并打开并最小化了2个excel工作簿,当我尝试(按工作簿名称)激活我想要的工作簿,然后尝试ap??p.activewindow.activate激活时,它并不总是使我想要的工作簿处于活动状态,友善的帮助一些对我有用的魔法: 12app.WindowState = XlWindowState.xlMinimized; // -4140 app.WindowState = XlWindowState.xlMaximized; // -4137 相关讨论 此答案的好处是,即使应用程序尚未打开工作簿,它也可以工作。我发现这行得通。如何将Excel应用程序置于最前面 1234567891011121314[DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool SetForegroundWindow(IntPtr hWnd); [DllImport("user32.dll", SetLastError = true)] static extern IntPtr FindWindow(string lpClassName, string lpWindowName); public static void BringExcelWindowToFront(Application xlApp) { string caption = xlApp.Caption; IntPtr handler = FindWindow(null, caption); SetForegroundWindow(handler); }我会尝试通过 激活excel窗口 1app.ActiveWindow.Activate();如果这不起作用,您可能会在此线程上找到其他解决方案(涉及本机WinAPI调用),网址为http://social.msdn.microsoft.com/ 有时,如果在Excel中同时打开多个文件,则ActiveWindow.Activate()将不起作用。 一个成功的诀窍是最小化然后最大化命令。 我知道有点晚了,但是为什么需要使用FindWindow来通过应用程序访问Windows句柄: 12345678[DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool SetForegroundWindow(IntPtr hWnd); public static void BringExcelWindowToFront(Application xlApp) { SetForegroundWindow((IntPtr)xlApp.Hwnd); // Note Hwnd is declared as int }如果多个窗口具有相同的标题,将没有问题。 要激活特定的工作簿,请执行以下操作: 123456789101112131415 [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool SetForegroundWindow(IntPtr hWnd); public static void BringExcelWindowToFront(Excel._Workbook xlBook) { var windows = xlBook.Windows; foreach (Excel.Window window in windows) { IntPtr handler = (IntPtr)window.Hwnd; SetForegroundWindow(handler); return; } } |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |